import json
from django.shortcuts import render, redirect, reverse,HttpResponse
from web.forms.file import FolderModelForm, FileModelForm
from django.http import JsonResponse
from django.forms import model_to_dict
from django.views.decorators.csrf import csrf_exempt
from django.urls import reverse
from Utils.tencent.cos import delete_file, delete_file_list, credential
from web import models


def file(request, project_id):
    parent_object = None
    folder_id = request.GET.get('folder', '')
    if folder_id.isdecimal():
        parent_object = models.FileRepository.objects.filter(id=int(folder_id), file_type=2,
                                                             project_id=request.tracer.project.id).first()

    """ 文件列表  & 添加文件夹 """
    #  文件列表
    if request.method == 'GET':
        breadcrumb_list = []
        parent = parent_object
        while parent:
            # breadcrumb_list.insert(0,{'id':parent.id,'name':parent.name})
            breadcrumb_list.insert(0, model_to_dict(parent, ['id', 'name']))
            parent = parent.parent

        queryset = models.FileRepository.objects.filter(project=request.tracer.project)
        if parent_object:
            # 进入了某目录
            file_object_list = queryset.filter(parent=parent_object).order_by('-file_type')
        else:
            # 根目录
            file_object_list = queryset.filter(parent__isnull=True).order_by('-file_type')
        form = FolderModelForm(request, parent_object)
        context = {
            'form': form,
            'file_object_list': file_object_list,
            'breadcrumb_list': breadcrumb_list,
            'folder_object': parent_object
        }
        return render(request, 'file.html', context)
    #  添加文件夹  &  文件夹的修改
    fid = request.POST.get('fid', '')

    edit_object = None
    if fid.isdecimal():
        edit_object = models.FileRepository.objects.filter(id=int(fid), file_type=2,
                                                           project=request.tracer.project).first()

    if edit_object:
        #  编辑
        form = FolderModelForm(request, parent_object, data=request.POST, instance=edit_object)
    else:
        #  添加
        form = FolderModelForm(request, parent_object, data=request.POST)

    if form.is_valid():
        form.instance.project = request.tracer.project
        form.instance.file_type = 2
        form.instance.update_user = request.tracer.user
        form.instance.parent = parent_object
        form.save()
        return JsonResponse({"status": True})
    return JsonResponse({'status': False, 'error': form.errors})


def file_delete(request, project_id):
    """ 删除文件 """
    fid = request.GET.get('fid')
    #  删除数据库中 文件 & 文件夹（级联删除）
    delete_object = models.FileRepository.objects.filter(id=fid, project=request.tracer.project).first()
    if delete_object.file_type == 1:
        # 删除文件 将容量还给当前项目的已使用空间
        request.tracer.project.use_space -= delete_object.file_size
        request.tracer.project.save()
        # cos 中删除文件
        delete_file(request.tracer.project.bucket, request.tracer.project.region, delete_object.key)
        #  在数据库中删除当前文件
        delete_object.delete()
        return JsonResponse({'status': True})

    #  删除文件夹（找到文件夹下所有文件 -> 数据库文件删除， cos文件删除，项目已使用空间容量还回去）
    total_size = 0
    key_list = []
    folder_list = [delete_object, ]
    for folder in folder_list:
        child_list = models.FileRepository.objects.filter(project=request.tracer.project, parent=folder).order_by(
            '-file_type')
        for child in child_list:
            if child.file_type == 2:
                folder_list.append(child)
            else:
                # 文件大小汇总
                total_size += child.file_size
                # 删除文件
                key_list.append({"key": child.key})

    # COS 批量删除
    if key_list:
        delete_file_list(request.tracer.project.bucket, request.tracer.project.region, key_list)
    # 归还容量
    if total_size:
        request.tracer.project.use_space -= total_size
        request.tracer.project.save()
    #  删除数据库中的文件
    delete_object.delete()
    return JsonResponse({"status": True})


@csrf_exempt
def cos_credential(request, project_id):
    """ 获取cos 临时上传凭证  """
    # 做容量限制： 单文件  &  总容量
    file_list = json.loads(request.body.decode('utf-8'))
    total_size = 0
    per_file_limit = request.tracer.price_policy.per_file_size * 1024 * 1024
    total_file_limit = request.tracer.price_policy.project_space * 1024 * 1024 * 1024
    for item in file_list:
        #  文件字节大小  B
        #  单文件大小   M
        #  超出限制
        if item['size'] > per_file_limit:
            msg = "单文件超出限制,(最大{}M),文件: {}, 请升级套餐".format(request.tracer.price_policy.per_file_size, item['name'])
            return JsonResponse({'status': False, 'error': msg})
        total_size += item['size']
    #  总容量限制
    #  request.tracer.price_policy.project_space  项目允许空间
    #  request.tracer.project.use_space 项目 已使用空间
    if request.tracer.project.use_space + total_size > total_file_limit:
        return JsonResponse({'status': False, 'error': "容量超出限制，请升级套餐。"})

    data_dict = credential(request.tracer.project.bucket, request.tracer.project.region)
    return JsonResponse({'status': True, 'data': data_dict})


@csrf_exempt
def file_post(request, project_id):
    """ 已经上传成功的 文件写入到数据库 """
    print(request.POST)
    form = FileModelForm(request, data=request.POST)
    if form.is_valid():
        #  校验通过 写入数据库
        # form.instance.file_type = 1
        # form.update_user = request.tracer.user
        # instance = form.save() #   添加成功后 获取到新添加到那个对象
        data_dict = form.cleaned_data
        data_dict.pop('etag')
        data_dict.update({'project': request.tracer.project, 'file_type': 1, 'update_user': request.tracer.user})
        instance = models.FileRepository.objects.create(**data_dict)
        #  项目已使用的空间 : 更新
        request.tracer.project.use_space += data_dict['file_size']
        request.tracer.project.save()
        result = {
            'id': instance.id,
            'name': instance.name,
            'file_size': instance.file_size,
            'username': instance.update_user.username,
            # 'datetime': instance.update_datetime.strftime("%Y年-%m月-%d日-%H:%M"),
            'datetime': instance.update_datetime.strftime('%Y{y}%m{m}%d{d} %H:%M').format(y='年', m='月', d='日'),
            'download_url':reverse('file_download', kwargs={'project_id':project_id, 'file_id':instance.id}),

            # 'file_type':instance.get_file_type_display()

        }
        return JsonResponse({'status': True, 'data': result})

    return JsonResponse({'status': False, 'data': "文件错误"})


def file_download(request,project_id, file_id):
    """ 下载文件 """
    # 文件内容
    #  响应头

    import requests
    file_object = models.FileRepository.objects.filter(id = file_id, project_id=project_id).first()

    res = requests.get(file_object.file_path)
    data = res.content
    response = HttpResponse(data)
    #  设置响应头
    response['Content-Disposition']= "attachment; filename={}".format(file_object.name)
    return response

